setfacl —— 设置ACL信息
setfacl [-R [-H | -L | -P]] [-bdhkn] [-a position entries] [-m entries] [-M file] [-x entries | position] [-X file] [file ...]
setfacl
实用程序设置指定文件的自主访问控制信息。如果没有指定文件,或者列表只包含“-”,则文件名取自标准输入。
以下选项可用:
-a position entries
通过插入 entries 中指定的新ACL尝试来修改指定文件上的ACL,从 position 位置开始,从零开始计数。此选项仅适用于NFSv4 ACL。
-b
删除所有ACL条目,但从文件模式合成的条目除外——在POSIX.1e ACL的情况下,这三个条目是必需的。如果POSIX.1e ACL包含“mask”条目,则生成的ACL中“group”条目的权限将设置为与当前ACL的“group”和“mask”尝试相关的权限。
-d
这些操作应用于默认ACL条目,而不是访问ACL条目。目前,只有目录可能具有默认ACL。此选项不适用于NFSv4 ACL。
-h
如果操作的目标是符号链接,则对符号链接本身执行操作,而不是跟随链接。
-H
如果指定了 -R 选项,则会遵循命令行上的符号链接,因此不会受到命令的影响。(树遍历过程中遇到的符号链接不会被遵循。)
-k
删除指定文件上的所有默认ACL条目。如果指定的文件没有任何默认ACL条目,则不认为是错误。如果任何指定的文件不能有默认条目(即非目录),将报告错误。此选项不适用于NFSv4 ACL。
-L
如果指定了 -R 选项,则遵循所有符号链接。
-m entries
修改指定文件的ACL。将添加新条目,并根据条目参数修改现有条目。对于NFSv4 ACL,建议使用 -a 和 -x 选项。
-M file
通过添加新的ACL条目和使用文件文件中指定的ACL条目修改现有ACL条目来修改指定 file 上的ACL条目。如果 file 为 -
,则输入来自stdin。
-n
不要重新计算与ACL掩码条目关联的权限。此选项不适用于NFSv4 ACL。
-P
如果指定了 -R 选项,则不会遵循符号链接。这是默认设置。
-R
在任何指定的目录上递归执行该操作。修改或添加NFSv4 ACL条目时,继承标志仅应用于目录。
-x entries|position
如果指定了条目,请从指定文件的访问或默认ACL中删除在那里指定的ACL条目。否则,删除 position 指数的条目,从零开始计数。
以上选项按照命令行上指定的顺序进行评估。
POSIX.1E ACL条目包含三个冒号分隔的字段:ACL标签、ACL限定符和自主访问权限:
ACL 标签 —— ACL tag
ACL标签指定ACL条目类型,由以下之一组成:
ACL限定符 —— ACL qualifier
ACL限定符字段描述与ACL条目关联的用户或组。它可能包含以下内容之一:uid或用户名、gid或组名,或为空。
对于“user”ACL条目,空字段指定授予文件所有者的访问权限。对于“group”ACL条目,空字段指定授予文件拥有组的访问权限。“mask”和“other”ACL条目不使用此字段。
访问权限 —— access permission
访问权限字段最多包含以下各项之一:“r”、“w”和“x”,分别设置读取、写入和执行权限。其中每一个都可以被排除或替换为“-”字符,以表示无法访问。
对于包含默认“user”、“group”和“other”ACL条目以外的任何ACL条目的文件,都需要一个“mask”ACL条目。如果未指定 -n
选项且未指定“mask”ACL条目,则setfacl实用程序将应用一个“mask”ACLs条目,该条目由与结果ACL中所有“group”ACL条目关联的权限的联合组成。
在POSIX.1e扩展ACL存在的情况下,作用于文件系统对象模式的传统POSIX接口修改了语义。当对象的访问ACL上存在掩码条目时,掩码条目将替换组位;这发生在 stat(1)
或 ls(1)
等程序中。当对具有掩码的对象修改模式时,应用于组位的更改实际上将应用于掩码条目。这些语义提供了更大的应用程序兼容性:修改模式而不是ACL的应用程序将看到保守的行为,限制了所有其他用户和组条目授予的有效权限;这发生在 aschmod(1)
等程序中。
使用 -M 或 -X 选项从文件应用的ACL条目应采用以下形式:
当评估POSIX.1e ACL条目时,访问检查算法按以下顺序检查ACL条目:文件所有者、“user”ACL条目、文件所有者组、“group”ACL条目和“other”ACL条目。
命令行上指定的多个ACL条目用逗号分隔。
文件和目录可以从其父目录继承ACL条目。这是通过使用默认ACL来实现的。应该注意的是,在指定默认ACL之前,必须设置用户、组、其他和掩码的强制ACL条目。有关更多详细信息,请参阅下面的示例。可以使用 -d 创建默认ACL。
NFSv4 ACL条目包含四个或五个冒号分隔的字段:ACL标签、ACL限定符(仅适用于“user”和“group”标签)、自主访问权限、ACL继承标志和ACL类型:
ACL 标签 —— ACL tag
ACL标签指定ACL条目类型,由以下之一组成:
ACL限定符 —— ACL qualifier
ACL限定符字段描述与ACL条目关联的用户或组。它可能由以下之一组成:uid或用户名,或gid或组名。在标记类型为“owner@”、“group@”或“everything@”之一的条目中,此字段完全省略,包括尾随冒号。
访问权限 —— access permission
访问权限可以以短形式或长形式指定。短形式和长形式不能混合使用。长格式的权限由“/”字符分隔;简而言之,它们被连接在一起。有效的权限是:
短格式 | 长格式 | 含义 |
---|---|---|
r | read_data | 可读 |
w | write_data | 可写 |
x | execute | 可运行 |
p | append_data | 追加 |
D | delete_child | 删除子项目 |
d | delete | 删除 |
a | read_attributes | 读属性 |
A | write_attributes | 写属性 |
R | read_xattr | |
W | write_xattr | |
c | read_acl | |
C | write_acl | |
o | write_owner | |
s | synchronize |
此外,还可以使用以下权限集:
集 | 权限 |
---|---|
full_set | 所有权限,如上所示 |
modify_set | 除write_acl和write_owner之外的所有权限 |
read_set | read_data, read_attributes, read_xattr, read_acl |
write_set | write_data, append_data, write_attributes, write_xattr |
ACL继承标志 —— ACL inheritance flags
继承标志可以以短形式或长形式指定。短形式和长形式不能混合使用。长格式的访问标志由“/”字符分隔;简而言之,它们被连接在一起。有效的继承标志是:
短格式 | 长格式 |
---|---|
f | file_inherit |
d | dir_inherit |
i | inherit_only |
n | no_propagate |
I | inherited |
除了“inherited”标志外,继承标志只能在目录上设置。
ACL类型 —— ACL type
ACL类型字段为“allow”或“deny”。
使用 -M 或 -X 选项从文件应用的ACL条目应采用以下形式:如前所述,每行一个ACL条目;空白被忽略;忽略“#”后的任何文本(注释)。
NFSv4 ACL条目按其可见顺序进行评估。
命令行上指定的多个ACL条目用逗号分隔。
请注意,文件所有者始终被授予 read_acl
、 write_acl
、 read_attributes
和 write_attributes
权限,即使ACL会拒绝它。
setfacl
实用程序在成功时退出0,如果发生错误,则退出>0。
setfacl -d -m u::rwx,g::rx,o::rx,mask::rwx dir
setfacl -d -m g:admins:rwx dir
第一个命令设置POSIX.1e默认ACL的强制元素。第二个命令指定 admin 组中的用户可以对名为 dir 的目录拥有读取、写入和执行权限。应该注意的是,在 dir 下创建的任何文件或目录在创建时都将继承这些默认ACL。
setfacl -m u::rwx,g:mail:rw file
为 file 所有者的POSIX.1e ACL条目设置读取、写入和执行权限,并为 file 上的 mail 组设置读取和写入权限。
setfacl -m owner@:rwxp::allow,g:mail:rwp::allow file
语义上与上述示例相同,但适用于NFSv4 ACL。
setfacl -M file1 file2
在 file2 上设置/更新 file1 中包含的ACL条目。
setfacl -x g:mail:rw file
从 file 中删除包含读/写权限的组邮件POSIX.1e ACL条目。
setfacl -x0 file
从 file 中删除NFSv4 ACL中的第一个条目。
setfacl -bn file
从 file 中删除所有“access”ACL条目,但所需的三个条目除外。
getfacl file1 | setfacl -b -n -M - file2
将ACL条目从 file1 复制到 file2 。
getfacl [-dhinqv] [file ...]
getfacl
实用程序将与指定文件关联的自主访问控制信息写入标准输出。如果 getconf(1)
实用程序指示{_POSIX_ACL_EXTENDED}对 file 无效,则标准自主访问权限被解释为仅包含所需ACL条目的ACL。
以下选项可用:
-d
该操作应用于目录的默认ACL,而不是访问ACL。如果默认ACL无法与 file 关联,则会生成错误。此选项对NFSv4 ACL无效。
-h
如果操作的目标是符号链接,则从符号链接本身返回ACL,而不是跟随链接。
-i
对于NFSv4 ACL,在每个包含用户名或组名的条目末尾附加数字ID。POSIX.1e ACL忽略。
-n
以数字形式显示用户和组ID,而不是转换为用户名或组名。POSIX.1e ACL忽略此项。
-q
不要写关于名字和所有权的注释信息。这在处理包含不可打印字符的文件名时非常有用。
-v
对于NFSv4 ACL,以详细形式显示访问掩码和标志。对于POSIX.1e ACL忽略。
以下操作数可用:
file
应检索其ACL的文件的路径名。若未指定 file ,或将文件指定为 -
,则 getfacl
将从标准输入中读取路径名列表,每个路径名以一个换行符结尾。
有关ACL语法的说明,请参阅 setfacl(1)
手册页。
getfacl /
检索目录/的ACL。
getfacl -d /
检索目录/的默认ACL(如果有)。